#include <cv.h>
#include <highgui.h>
#include <math.h>
#include <stdio.h>
#include "config.h"

/* README
 * Fonction utilisée pour la configuration
 * Résultats :
 * DP     : 1 semble vraiment trop faible, 4 trop grand
 * Smooth : beaucoup de cercles détectés sans le smooth mais sans le smooth pour dp 2 ou 3 : pas mal
 * 			Smooth de 3/3 avec DP = 2 ou 3 semble intéressant
 * 			Ou pour les khepera, sans le smooth et dp=4, mais a confirmer...
 * --------------------------------------------------------------------------------------------------
 * Désormais on impose le smooth 3/3 et dp varie à 2 ou 3
 * Param1 / Param2 : 
 * 		Bons résultats pour (dp=2, p1=40, p2=120), (dp=2, p1=50, p2=150) et (dp=3, p1=50, p2=150)
 * 		Beaucoup de résultats pour p1 = 3*p2, trouver une méthode de tri...
 * 		p1 = 100 à 200 pour p2 = 50 : mauvais résultats pour dp = 3
 * 		lapin crétin avec dp=2, diamMin=1, dist=10, diamMax = 1/16, p1 entre 100 et 200 et p2=50 : bien (mais pas les khepera)
 * 		-----------------------------------------
 * 		p2 = 20 et p1 entre 100 et 200 : beaucoup trop de mauvais cercles
 * 		p2 = 20 et p1 entre 20 et 80 : horrible (beaucoup beaucoup trop)
 * 		p2 = 20 et p1 entre 200 et 350 : beaucoup trop (mais moins qu'avec p1 petit)
 * 		p2 = 30 et p1 entre 200 et 350 : beaucoup trop de cercles avec dp=3 et un peu trop pour dp=2
 * 						aucune détection de kheperas
 * 		p2 = 30 et p1 entre 90 et 210 : détections hasardeuses mais pour dp =2 : pas mal... (à retester)
 * 		p2 = 30 et p1 entre 20 et 80 : lapin crétin beaucoup trop
 * 						kheperas détectés mais beaucoup de mauvais cercles
 * 		p2 = 40 et p1 entre 20 et 80 : lapin crétin beaucoup trop surtout dp=3
 * 						!!!! la détection des kheperas semble bonne pour dp=3, p1=40, 60 ou 80. Quelques fausses détections
 * 		p2 = 40 et p1 entre 100 et 200 : kheperas détectés
 * 		p2 = 40 et p1 entre 90 et 210 : lapin crétin ok pour dp=2 mais pas dp=3
 * 						!!!! certains kheperas détectés (p1 = 90 ou 130 et dp = 3)
 * 		p2 = 40 et p1 entre 200 et 350 : lapin crétin ok pour dp=2 et p1 = 200 ou 250
 * 						presque aucune détection de kheperas
 * 		p2 = 50 et p1 entre 200 et 350 : lapin crétin ok pour dp=2 et p1 = 200 ou 250
 * 						aucune détection de khepera
 * 		p2 = 50 et p1 entre  90 et 210 : lapin crétin ok pour dp=2 et p1 = 170 ou 210
 * 						aucune détection de khepera
 * 		p2 = 50 et p1 entre  20 et 80 : lapin crétin trop de mauvaises détections
 * 						aucune détection de khepera, ou beaucoup trop hasardeuses
 * 		p2 = 60 et p1 entre  20 et 80 : lapin crétin pas mal pour dp=2 mais bcp de fausses détections
 * 						aucune détection de khepera
 * 		p2 = 60 et p1 entre  90 et 210 : lapin crétin très bien pour dp=2
 * 						aucune détection de khepera
 * 		p2 = 60 et p1 entre  200 et 350 : lapin crétin très bien pour dp=2 et p1=200 ou 250
 * 						aucune détection de khepera
 * 		p2 = 70 et p1 entre  200 et 350 : lapin crétin très bien pour dp=2 et p1=200 ou 250
 * 						aucune détection de khepera
 * 		p2 = 70 et p1 entre  90 et 210 : lapin crétin très bien pour dp=2 et p1=170 ou 210
 * 						aucune détection de khepera
 * 		p2 = 70 et p1 entre  20 et 80 : lapin crétin pas très bien
 * 						aucune détection de khepera
 * 		p2 = 80 et p1 entre  20 et 80 : lapin crétin pas très bien
 * 						aucune détection de khepera
 * 		p2 = 80 et p1 entre  90 et 210 : lapin crétin très bien pour dp=2 et p1=170 ou 210
 * 						aucune détection de khepera
 * 		p2 = 80 et p1 entre  200 et 250 : lapin crétin très bien pour p1=200 ou 250
 * 						aucune détection de khepera
 * 		p2 = 90 et p1 entre  200 et 250 : lapin crétin pas mal pour p1 = 200 ou 250
 * 						aucune détection de khepera
 * 		p2 = 90 et p1 entre  90 et 210 : lapin crétin pas mal pour dp=2 et p1=170 ou 210
 * 						aucune détection de khepera
 * 		p2 = 90 et p1 entre  20 et 90 : lapin crétin détecté moyennement
 * 						aucune détection de khepera
 * --------------------------------------------------------------------------------------
 * Moralité : affiner les tests avec les résultats obtenus :
 * 		p2 = 30 et p1 entre 90 et 210
 * 		p2 = 30 et p1 entre 20 et  80
 * 		p2 = 40 et p1 entre 20 et 80
 * 		p2 = 40 et p1 entre 90 et 210
 * 		p2 = 40 et p1 entre 100 et 200
 * 			p2=27 - dp=2 - p1 entre  30 et  65 (pas de  5) : peu probant (un seul K, pas systématique)
 * 			p2=27 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut souvent, parfois l'autre)
 * 			p2=27 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut rare, K du bas jamais)
 * 			
 * 			p2=28 - dp=2 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut souvent, K du bas rare)
 * 			p2=28 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut souvent, K du bas rare)
 * 			p2=28 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut rare, K du bas jamais)
 * 
 * 			p2=29 - dp=2 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut souvent, K du bas rare)
 * 			p2=29 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut souvent, K du bas rare)
 * 			p2=29 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut rare, K du bas jamais)
 * 
 * 			p2=30 - dp=2 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut très souvent, K du bas rare)
 * 			p2=30 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut souvent, K du bas rare)
 * 			p2=30 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut rare, K du bas jamais)
 * 
 * 			p2=31 - dp=2 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut souvent, K du bas rare)
 * 			p2=31 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut parfois, K du bas rare)
 * 			p2=31 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut rare, K du bas jamais)
 * 
 * 			p2=32 - dp=2 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut souvent, K du bas rare)
 * 			p2=32 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut parfois, K du bas rare)
 * 			p2=32 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut très rare, K du bas jamais)
 * 
 * 			p2=33 - dp=2 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut souvent, K du bas rare)
 * 			p2=33 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut parfois, K du bas rare)
 * 			p2=33 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut très rare, K du bas jamais)
 * 
 * 			p2=34 - dp=2 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut souvent, K du bas rare)
 * 			p2=34 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut parfois, K du bas rare)
 * 			p2=34 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut très rare, K du bas jamais)
 * 
 * 			p2=35 - dp=2 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut souvent, K du bas rare)
 * 			p2=35 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut parfois, K du bas rare)
 * 			p2=35 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut très rare, K du bas jamais)
 * 
 * 			p2=36 - dp=2 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut souvent, K du bas rare)
 * 			p2=36 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut parfois, K du bas rare)
 * 			p2=36 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut très rare, K du bas jamais)
 * 
 * 			p2=37 - dp=2 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut souvent, K du bas rare)
 * 			p2=37 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut rare, K du bas très rare)
 * 			p2=37 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut très rare, K du bas jamais)
 * 
 * 			p2=38 - dp=2 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut souvent, K du bas rare)
 * 			p2=38 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut rare, K du bas jamais)
 * 			p2=38 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut très rare, K du bas jamais)
 * 
 * 			p2=39 - dp=2 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut souvent, K du bas rare)
 * 			p2=39 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut rare, K du bas jamais)
 * 			p2=39 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut très rare, K du bas jamais)
 * 
 * 			p2=40 - dp=2 - p1 entre  30 et  65 (pas de  5) : pas probant (K du haut occasionnel, K du bas jamais)
 * 			p2=40 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut rare, K du bas jamais)
 * 			p2=40 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut très rare, K du bas jamais)
 * 
 * 			p2=41 - dp=2 - p1 entre  30 et  65 (pas de  5) : pas probant (K du haut occasionnel, K du bas jamais)
 * 			p2=41 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut rare, K du bas jamais)
 * 			p2=41 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut jamais, K du bas jamais)
 * 
 * 			p2=42 - dp=2 - p1 entre  30 et  65 (pas de  5) : pas probant (K du haut occasionnel, K du bas jamais)
 * 			p2=42 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut rare, K du bas jamais)
 * 			p2=42 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut jamais, K du bas jamais)
 * 
 * 			p2=43 - dp=2 - p1 entre  30 et  65 (pas de  5) : pas probant (K du haut occasionnel, K du bas jamais)
 * 			p2=43 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut rare, K du bas jamais)
 * 			p2=43 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut jamais, K du bas jamais)
 * 
 * 			p2=44 - dp=2 - p1 entre  30 et  65 (pas de  5) : pas probant (K du haut occasionnel, K du bas jamais)
 * 			p2=44 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut rare, K du bas jamais)
 * 			p2=44 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut jamais, K du bas jamais)
 * 
 * 			p2=45 - dp=2 - p1 entre  30 et  65 (pas de  5) : pas probant (K du haut occasionnel, K du bas jamais)
 * 			p2=45 - dp=2 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut rare, K du bas jamais)
 * 			p2=45 - dp=2 - p1 entre 150 et 220 (pas de 10) : peu probant (K du haut jamais, K du bas jamais)
 * 			--------------------------------------------------------------------------------------------
 * 			p2=27 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut et bas détectés / beaucoup trop d'autres)
 * 			p2=27 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut toujours, K du bas parfois / beaucoup trop d'autres)
 * 			p2=27 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut rare, K du bas rare / beaucoup d'autres)
 * 			
 * 			p2=28 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut et bas détectés / beaucoup trop d'autres)
 * 			p2=28 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut toujours, K du bas parfois / beaucoup trop d'autres)
 * 			p2=28 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut rare, K du bas rare / beaucoup d'autres)
 * 
 * 			p2=29 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut et bas détectés / beaucoup trop d'autres)
 * 			p2=29 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut souvent, K du bas parfois / beaucoup trop d'autres)
 * 			p2=29 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut rare, K du bas rare / beaucoup d'autres)
 * 
 * 			p2=30 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut et bas détectés / beaucoup trop d'autres)
 * 			p2=30 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut souvent, K du bas parfois / beaucoup trop d'autres)
 * 			p2=30 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut rare, K du bas jamais / beaucoup d'autres)
 * 
 * 			p2=31 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut et bas détectés / beaucoup trop d'autres)
 * 			p2=31 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut souvent, K du bas parfois / beaucoup trop d'autres)
 * 			p2=31 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut rare, K du bas jamais / beaucoup d'autres)
 * 
 * 			p2=32 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut et bas détectés / beaucoup trop d'autres)
 * 			p2=32 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut souvent, K du bas rare / beaucoup trop d'autres)
 * 			p2=32 - dp=3 - p1 entre 150 et 220 (pas de 10) : 
 * 
 * 			p2=33 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut et bas détectés / beaucoup trop d'autres)
 * 			p2=33 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut souvent, K du bas rare / beaucoup trop d'autres)
 * 			p2=33 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut rare, K du bas jamais / beaucoup d'autres)
 * 
 * 			p2=34 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut et bas détectés / beaucoup trop d'autres)
 * 			p2=34 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut souvent, K du bas rare / beaucoup trop d'autres)
 * 			p2=34 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut rare, K du bas jamais / beaucoup d'autres)
 * 
 * 			p2=35 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut et bas détectés / beaucoup trop d'autres)
 * 			p2=35 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut souvent, K du bas rare / beaucoup trop d'autres)
 * 			p2=35 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut rare, K du bas jamais / beaucoup d'autres)
 * 
 * 			p2=36 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut et bas détectés / beaucoup trop d'autres)
 * 			p2=36 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut parfois, K du bas rare / beaucoup trop d'autres)
 * 			p2=36 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut jamais, K du bas jamais / beaucoup d'autres)
 * 
 * 			p2=37 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut et bas détectés / beaucoup trop d'autres)
 * 			p2=37 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut parfois, K du bas rare / beaucoup trop d'autres)
 * 			p2=37 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut jamais, K du bas jamais / beaucoup d'autres)
 * 
 * 			p2=38 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut et bas détectés / beaucoup trop d'autres)
 * 			p2=38 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut parfois, K du bas rare / beaucoup trop d'autres)
 * 			p2=38 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut jamais, K du bas jamais / beaucoup d'autres)
 * 
 * 			p2=39 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut et bas détectés / beaucoup trop d'autres)
 * 			p2=39 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut parfois, K du bas rare / beaucoup trop d'autres)
 * 			p2=39 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut jamais, K du bas jamais / beaucoup d'autres)
 * 
 * 			p2=40 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut toujours, K du bas souvent / beaucoup trop d'autres)
 * 			p2=40 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut parfois, K du bas rare / beaucoup trop d'autres)
 * 			p2=40 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut jamais, K du bas jamais / beaucoup d'autres)
 * 
 * 			p2=41 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut toujours, K du bas souvent / beaucoup trop d'autres)
 * 			p2=41 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut parfois, K du bas rare / beaucoup trop d'autres)
 * 			p2=41 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut jamais, K du bas jamais / beaucoup d'autres)
 * 
 * 			p2=42 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut toujours, K du bas souvent / beaucoup trop d'autres)
 * 			p2=42 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut parfois, K du bas rare / beaucoup trop d'autres)
 * 			p2=42 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut jamais, K du bas jamais / beaucoup d'autres)
 * 
 * 			p2=43 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut souvent, K du bas parfois / beaucoup trop d'autres)
 * 			p2=43 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut parfois, K du bas rare / beaucoup trop d'autres)
 * 			p2=43 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut jamais, K du bas jamais / beaucoup d'autres)
 * 
 * 			p2=44 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut souvent, K du bas parfois / beaucoup trop d'autres)
 * 			p2=44 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut rare, K du bas rare / beaucoup trop d'autres)
 * 			p2=44 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut jamais, K du bas jamais / beaucoup d'autres)
 * 
 * 			p2=45 - dp=3 - p1 entre  30 et  65 (pas de  5) : peu probant (K du haut souvent, K du bas parfois / beaucoup trop d'autres)
 * 			p2=45 - dp=3 - p1 entre  70 et 140 (pas de 10) : peu probant (K du haut rare, K du bas rare / beaucoup trop d'autres)
 * 			p2=45 - dp=3 - p1 entre 150 et 220 (pas de 10) : pas probant (K du haut jamais, K du bas jamais / beaucoup d'autres)
 * 		(dp=2, p1=40, p2=120), (dp=2, p1=50, p2=150) et (dp=3, p1=50, p2=150)
 * 			p1=38 - dp=2 - p2 entre 116 et 123 (pas de  1) : 
 * 			p1=39 - dp=2 - p2 entre 116 et 123 (pas de  1) : 
 * 			p1=40 - dp=2 - p2 entre 116 et 123 (pas de  1) : 
 * 			p1=41 - dp=2 - p2 entre 116 et 123 (pas de  1) : 
 * 			p1=42 - dp=2 - p2 entre 116 et 123 (pas de  1) : 
 * 			--------
 * 			p1=48 - dp=2 - p2 entre 146 et 153 (pas de  1) : 
 * 			p1=49 - dp=2 - p2 entre 146 et 153 (pas de  1) : 
 * 			p1=50 - dp=2 - p2 entre 146 et 153 (pas de  1) : 
 * 			p1=51 - dp=2 - p2 entre 146 et 153 (pas de  1) : 
 * 			p1=52 - dp=2 - p2 entre 146 et 153 (pas de  1) : 
 * 			--------
 * */
//int dp10 = 1, dp20 = 2, dp30 = 3, dp40 = 4;
int dp1 = 3, dp2 = 3;
//int p111 = 30, p112 = 35, p121 = 40, p122 =  45, p131 =  50, p132 =  55, p141 =  60, p142 =  65;
//int p111 = 70, p112 = 80, p121 = 90, p122 = 100, p131 = 110, p132 = 120, p141 = 130, p142 = 140;
//int p111 =150, p112 =160, p121 =170, p122 = 180, p131 = 190, p132 = 200, p141 = 210, p142 = 220;
//int p111 = 40, p112 = 40, p121 = 40, p122 = 40, p131 = 40, p132 = 40, p141 = 40, p142 = 40;
int p211 =116, p212 =117, p221 =118, p222 =119, p231 =120, p232 =121, p241 =122, p242 =123;
//int p211 =31, p212 =32, p221 =33, p222 =34, p231 =35, p232 =36, p241 =37, p242 =38;
int param;
//int param;
int diamMin = 1;
int dist = 10;
int mainHoughcircles(int argc, char** argv)
{
	if (argc != 2 )
	{
		printf("<mainHoughcircles> : il faut 1 parametre\n");
		return -1;
	}
	param = atoi(argv[1]);
	int numImage;
	printf("<mainHoughcircles> : debut de la fonction param=%d\n", param);
	cvNamedWindow( "circles11" , 2 );
    cvNamedWindow( "circles12" , 2 );
    cvNamedWindow( "circles21" , 2 );
    cvNamedWindow( "circles22" , 2 );
    cvNamedWindow( "circles31" , 2 );
    cvNamedWindow( "circles32" , 2 );
    cvNamedWindow( "circles41" , 2 );
    cvNamedWindow( "circles42" , 2 );
	cvMoveWindow("circles11",   0,   0);
	cvMoveWindow("circles12",   0, 300);
	cvMoveWindow("circles21", 300,  0);
	cvMoveWindow("circles22", 300, 300);
	cvMoveWindow("circles31", 600,   0);
	cvMoveWindow("circles32", 600, 300);
	cvMoveWindow("circles41", 900,   0);
	cvMoveWindow("circles42", 900, 300);
    for( numImage = 0; names[numImage] != 0; numImage++ )
    {
    	char nomImage[40] = "";
    	strcat(nomImage, folder);
    	strcat(nomImage, names[numImage]);
        // load i-th image
    	IplImage* img11;
    	IplImage* img12;
    	IplImage* img21;
    	IplImage* img22;
    	IplImage* img31;
    	IplImage* img32;
    	IplImage* img41;
    	IplImage* img42;
    	
        IplImage* gray1;
        //IplImage* gray2;
        CvMemStorage* storage11 = cvCreateMemStorage(0);
        CvMemStorage* storage12 = cvCreateMemStorage(0);
        CvMemStorage* storage21 = cvCreateMemStorage(0);
        CvMemStorage* storage22 = cvCreateMemStorage(0);
        CvMemStorage* storage31 = cvCreateMemStorage(0);
        CvMemStorage* storage32 = cvCreateMemStorage(0);
        CvMemStorage* storage41 = cvCreateMemStorage(0);
        CvMemStorage* storage42 = cvCreateMemStorage(0);
        
        CvSeq* circles11;
        CvSeq* circles12;
        CvSeq* circles21;
        CvSeq* circles22;
        CvSeq* circles31;
        CvSeq* circles32;
        CvSeq* circles41;
        CvSeq* circles42;
        int tailleMax;
        int touche;
        int diamMax;
        
    	img11 = cvLoadImage( nomImage, 1 );
        if( !img11 )
        {
            printf("<mainHoughcircles> Couldn't load %s\n", names[numImage] );
            continue;
        }
        img12 = cvCloneImage( img11 );
        img21 = cvCloneImage( img11 );
        img22 = cvCloneImage( img11 );
        img31 = cvCloneImage( img11 );
        img32 = cvCloneImage( img11 );
        img41 = cvCloneImage( img11 );
        img42 = cvCloneImage( img11 );
        gray1 = cvCreateImage( cvGetSize(img11), 8, 1 );
        //gray2 = cvCreateImage( cvGetSize(img12), 8, 1 );
		
        tailleMax = MAX(gray1->width,gray1->height);
        diamMax = tailleMax/16;
        cvCvtColor( img11, gray1, CV_BGR2GRAY );
        cvSmooth( gray1, gray1, CV_GAUSSIAN, 3, 3, 0, 0 ); // smooth it, otherwise a lot of false circles may be detected
        //cvSmooth( gray1, gray2, CV_GAUSSIAN, 3, 3, 0, 0 ); // ligne précédente, avant d'imposer le smooth
        printf("<mainHoughcircles> : cvSmooth ok\n");
        /*cvNamedWindow( "img", 1 );
   		cvShowImage( "img", img );
        cvNamedWindow( "gray", 1 );
        cvShowImage( "gray", gray );
        touche = cvWaitKey(0);
    	cvDestroyWindow( "img" );
    	cvDestroyWindow( "gray" );*/
    	circles11 = cvHoughCircles( gray1, storage11, CV_HOUGH_GRADIENT, dp1, dist, param, p211, diamMin, diamMax);
        circles12 = cvHoughCircles( gray1, storage12, CV_HOUGH_GRADIENT, dp2, dist, param, p212, diamMin, diamMax);
		printf("<mainHoughcircles> : circles11 et circles12 ok\n");
        circles21 = cvHoughCircles( gray1, storage21, CV_HOUGH_GRADIENT, dp1, dist, param, p221, diamMin, diamMax);
        circles22 = cvHoughCircles( gray1, storage22, CV_HOUGH_GRADIENT, dp2, dist, param, p222, diamMin, diamMax);
		printf("<mainHoughcircles> : circles21 et circles22 ok\n");
        circles31 = cvHoughCircles( gray1, storage31, CV_HOUGH_GRADIENT, dp1, dist, param, p231, diamMin, diamMax);
        circles32 = cvHoughCircles( gray1, storage32, CV_HOUGH_GRADIENT, dp2, dist, param, p232, diamMin, diamMax);
		printf("<mainHoughcircles> : circles31 et circles32 ok\n");
        circles41 = cvHoughCircles( gray1, storage41, CV_HOUGH_GRADIENT, dp1, dist, param, p241, diamMin, diamMax);
        circles42 = cvHoughCircles( gray1, storage42, CV_HOUGH_GRADIENT, dp2, dist, param, p242, diamMin, diamMax);
		printf("<mainHoughcircles> : circles41 et circles42 ok\n");
        
		printf("<mainHoughcircles> : image %d : %s : [%d / %d / %d / %d]\n", numImage, names[numImage], circles11->total, circles12->total, circles21->total, circles22->total);
        int i;
        for( i = 0; i < circles11->total; i++ )
        {
             float* p = (float*)cvGetSeqElem( circles11, i );
             cvCircle( img11, cvPoint(cvRound(p[0]),cvRound(p[1])), 3            , CV_RGB(0,255,0), -1, 8, 0 );
             cvCircle( img11, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0),  3, 8, 0 );
        }
        for( i = 0; i < circles12->total; i++ )
        {
             float* p = (float*)cvGetSeqElem( circles12, i );
             cvCircle( img12, cvPoint(cvRound(p[0]),cvRound(p[1])), 3            , CV_RGB(0,255,0), -1, 8, 0 );
             cvCircle( img12, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0),  3, 8, 0 );
        }
        for( i = 0; i < circles21->total; i++ )
        {
             float* p = (float*)cvGetSeqElem( circles21, i );
             cvCircle( img21, cvPoint(cvRound(p[0]),cvRound(p[1])), 3            , CV_RGB(0,255,0), -1, 8, 0 );
             cvCircle( img21, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0),  3, 8, 0 );
        }
        for( i = 0; i < circles22->total; i++ )
        {
             float* p = (float*)cvGetSeqElem( circles22, i );
             cvCircle( img22, cvPoint(cvRound(p[0]),cvRound(p[1])), 3            , CV_RGB(0,255,0), -1, 8, 0 );
             cvCircle( img22, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0),  3, 8, 0 );
        }
        for( i = 0; i < circles31->total; i++ )
        {
             float* p = (float*)cvGetSeqElem( circles31, i );
             cvCircle( img31, cvPoint(cvRound(p[0]),cvRound(p[1])), 3            , CV_RGB(0,255,0), -1, 8, 0 );
             cvCircle( img31, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0),  3, 8, 0 );
        }
        for( i = 0; i < circles32->total; i++ )
        {
             float* p = (float*)cvGetSeqElem( circles32, i );
             cvCircle( img32, cvPoint(cvRound(p[0]),cvRound(p[1])), 3            , CV_RGB(0,255,0), -1, 8, 0 );
             cvCircle( img32, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0),  3, 8, 0 );
        }
        for( i = 0; i < circles41->total; i++ )
        {
             float* p = (float*)cvGetSeqElem( circles41, i );
             cvCircle( img41, cvPoint(cvRound(p[0]),cvRound(p[1])), 3            , CV_RGB(0,255,0), -1, 8, 0 );
             cvCircle( img41, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0),  3, 8, 0 );
        }
        for( i = 0; i < circles42->total; i++ )
        {
             float* p = (float*)cvGetSeqElem( circles42, i );
             cvCircle( img42, cvPoint(cvRound(p[0]),cvRound(p[1])), 3            , CV_RGB(0,255,0), -1, 8, 0 );
             cvCircle( img42, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0),  3, 8, 0 );
        }
        cvShowImage( "circles11", img11 );
        cvShowImage( "circles12", img12 );
        cvShowImage( "circles21", img21 );
        cvShowImage( "circles22", img22 );
        cvShowImage( "circles31", img31 );
        cvShowImage( "circles32", img32 );
        cvShowImage( "circles41", img41 );
        cvShowImage( "circles42", img42 );
        touche = cvWaitKey(0);
        cvReleaseImage( &gray1 );
        //cvReleaseImage( &gray2 );
        cvReleaseImage( &img11 );
        cvReleaseImage( &img12 );
        cvReleaseImage( &img21 );
        cvReleaseImage( &img22 );
        cvReleaseImage( &img31 );
        cvReleaseImage( &img32 );
        cvReleaseImage( &img41 );
        cvClearMemStorage( storage11 );
        cvClearMemStorage( storage12 );
        cvClearMemStorage( storage21 );
        cvClearMemStorage( storage22 );
        cvClearMemStorage( storage31 );
        cvClearMemStorage( storage32 );
        cvClearMemStorage( storage41 );
        cvClearMemStorage( storage42 );
        if( (char)touche == 27 )
            break;
    } // for toutes les images de names
	cvDestroyWindow( "circles11" );
	cvDestroyWindow( "circles12" );
	cvDestroyWindow( "circles21" );
	cvDestroyWindow( "circles22" );
	cvDestroyWindow( "circles31" );
	cvDestroyWindow( "circles32" );
	cvDestroyWindow( "circles41" );
	cvDestroyWindow( "circles42" );
    return 0;
}
